package com.seafwg.designmode;

/**
 * @Author seafwg
 * @Date 2022/7/24 17:22
 * @Version 1.0
 * @description 静态代理模式：
 * 代理模式有三个对象：
 *  1.公共功能的封装：接口层
 *  2.代理对象：
 *  3.被代理对象
 */

public class StaticProxyDesign {

    public static void main(String[] args) {
        // 创建被代理对象的实例
        SelfProxyServer selfProxyServer = new SelfProxyServer();
        // 通过代理对象的带参【代理对象以参数的形式，通过多态体现】构造函数生成代理对象
        ProxyServer proxyServer = new ProxyServer(selfProxyServer);
        // 代理对象实例调用自己的浏览方法，自己的方法通过被代理对象的实例访问的事自己的方法
        proxyServer.browser();
    }
}

/**
 * 功能描述：实现一个上网的流程
 * 1.接口层实现上网浏览的约束和规范
 * 2.代理类的功能非常齐全完善，相当于框架类库等的实现。主要实现上网前的校验等，通过校验，
 *  以多态的形式调用浏览方法
 * 3.被代理对象，也就是我们主要更能的实现。主要实现上网的一些功能
 */

interface NetWork{
    void browser();
}

/**
 * 代理对象：如同框架，库实现的功能
 */
class ProxyServer implements NetWork{
    /**
     * 私有属性：公共类型的变量
     */
    private NetWork netWork;

    /**
     * 构造器初始化变量
     * @param netWork
     */
    public ProxyServer(NetWork netWork) { // 接口用于多态
        this.netWork = netWork;
    }

    /**
     * 上网前的检查：
     * @return
     */
    public boolean check() {
        return true;
    }

    /**
     * 具体上网的方法，通过自己私有变量访问傻姑娘我那个的方法，其实是利用多态访问被代理类重写的浏览方法
     */
    @Override
    public void browser() {
        if (check()) {
            netWork.browser();
        } else {
            System.out.println("网络故障了...");
        }
    }
}

/**
 * 被代理类，也就是我们自己实现的功能：
 */
class SelfProxyServer implements NetWork{

    @Override
    public void browser() {
        System.out.println("开始浏览网络");
        System.out.println("开始买东西，剁手了...");
    }
}